数组  扩展变量
    数组的定义
        $a = array()
        $a = array(123, "hello", 36567.256);
        $a = [123, "hello", 2345476.345];

        格式：
            $数组名 = array(键名 => 键值, ...);
            $数组名 = [键名 => 键值, ...];

            $数组名[] = 键值;
            如果数组不存在则创建, 数组存在则追加元素，键名在最大值加1

        键名只能是数字与字符串，键值可以是任何类型
        键名为可选项，没有指定键名为数组最大数字键名值加1, 默认从0开始
        字符串键名推荐使用单引号，不加引号也可以访问键值，但效率极低, 不推荐使用
        一个数组中键名不能重名, 会互相覆盖
        键名的强制类型转化：
            合法字符串数字会转成整型 "12"会转成12 "08"不会转化
            浮点数会转成整型 去除小数点部分
            布尔型会转成整型 true为1, false为0
            null会转为空字符串 "", 不推荐使用空括号作键名
            数组和对象不能做键名， 会出现iiegal offset type警告

    数组的访问  通过中括号来访问数组元素
        访问对应数组指定键名的键值: $数组名[键名]
        对数组元素没有指定键名，所有元素键名从零开始连续不断规律的数字
        没有指定键名数组可以通过for循环批量访问
        count/sizeof    获取数组元素个数
        键名不连续的数组可以foreach批量访问(推荐使用,比for/while效率高)
            foreach ($数组名 as [中间键名变量] => 中间键值变量) {

            }

    数组的赋值
        对指定数组键名元素赋值: $数组名[键名] = 键值;

    数组的删除
        删除整个数组: unset($数组名);
        删除某个数组元素: unset($数组名[键名]);

    数组作为函数的参数
        数组传参与普通类型变量传参一样，都是形参复制实参, 不能在函数修改实参数组的值
        如果在函数内容修改实参数组元素的值则引用传递

    数组作为函数的返回值
        直接返回数组，函数返回是数组可以直接对函数名中括号获取返回数组对应的值

    多维数组
        给我们数组元素值赋数组则为多维数组
        通过嵌套循环访问或赋值(不推荐嵌套循环赋值)


运行chess/snake/writer程序需要安装glibc.i386
    sudo apt install libc6.i386
    ./chess

数组与数据结构
    线性表  有头有尾，第一个元素与第二元素有关系，第二元素 与第三元素有关系，以此类推
    限定性的线性表：栈与队列
        栈：数据元素必须先进后出        容器
            array_push/array_pop
        队列：数据元素必须是先进先出    管道
            array_push/array_shift
            普通队列    使用一次队列再无法使用队列
            环形队列    重复使用队列，缓冲区

    排序 为了二分查找
        快速排序 插入排序 冒泡排序 选择排序
    查找
        顺序查找 二分查找  哈希查找

数组的运算符
    +       联合两个数组
    ==      两个数组的键名与键值是否相等
    ===     两个数组的键名与键值以及顺序和类型是否相等
    !=/<>   两个数组的键名与键值是否不相等
    !==     两个数组的键名与键值以及顺序和类型是否不相等

declare 流程控制语法
    目前只有两个指令 ticks 和 encoding
    ticks  每执行N次PHP低级指令产生一次事件
        可以使用register_tick_function函数注册ticks事件操作函数
        Zend引擎原理有关
        主要用于调试、性能测试、实现简单的多任务或后台I/O操作
        可能通过unregister_tick_function卸载ticks事件函数

注册脚本退出函数 register_shutdown_function
    exit/die    自动调用register_shutdown_function注册的函数

数组操作函数
    w3m http://3.3.3.1/php_manual/book.array.html

    定义数组
        array           *定义新数组, 可以使用[]来替代
        range           *定义指定范围元素的新数组
        array_fill      *定义指定个数与元素值的新数组
        array_combine   定义新数组，键和值分别由其它数组值来指定
            键与值的数组个数必须一样，否则会警告

    数组取值
        array_rand      *随机从数组中取出一个/多个元素的键名
        array_column    *针对二维数组取指定列(取结果集列)

    数组检查
        in_array        *在数组中查找某个值是否存在
        array_key_exists/key_exists  *在数组中查找某个键名是否存在

    元素添加
        array_push      *在数组尾部添加一个或多个元素值, 可以使用数组空括号来代替
            $a[] = "hello";  等同于 array_push($a, "hello");
        array_unshift   *在数组头部添加一个或多个元素值

    元素取出(取值删除)
        array_pop       *从数组尾部取值，并且从数组中删除
        array_shift     *从数组头部取值，并且从数组中删除

    数组修改
        array_pad       返回数组填充后的结果数组
        shuffle        *将数组元素顺序打乱
        array_walk/array_walk_recursive
                封装对数组的循环遍历，用回调函数对数组元素操作
                array_walk_recursive会递归数组元素(可以处理数组中的数组)
        array_filter    数组过滤

    数组分割
        array_chunk     *返回指定个数分割的原数组的新多维数组
            第三个参数preserve_keys       是否保留键名

    数组反转
        array_reverse   *返回对数组反转后的新数组
            第二个参数preserve_keys       是否保留键名

    数组去重
        array_unique    将数组元素重复值合并为一个组合新数组返回

    数组替换(将多个数组合并)
        +       相同键名不会替换
        array_replace/array_replace_recursive
            相同键名直接替换
        array_merge/array_merge_recursive
            字符串键名相同替换，数字键名相同追加

    数组截取
        array_slice     *从指定偏移量开始载取指定长度的元素组合为新数组返回
            第四个参数为是否保留键名
        array_splice    *将从指定偏移量到指定长度的元素删除或替换成指定元素的值

    数组差集
        array_diff      返回数组1有但数组2不存在的值组合的新数组
        array_diff_key  返回数组1有但数组2不存的键名组合的新数组


    交换键和值
        array_flip

    数组键操作
        array_keys      *返回数组所有或指定键名
        array_search    *返回搜索元素值对应的键名
        array_change_key_case   返回对数组键名转换大小写的新数组
        array_values    *返回对数组元素重新数组索引的新数组


    数组统计
        count/sizeof        *返回数组元素个数
        array_count_values  返回统计数组元素重复个数的新数组
        array_product       返回数组元素所有值乘积
        array_sum           返回数组元素所有值和
        array_reduce        返回数组元素所有值进行回调处理的结果

    数组内部指针操作        *
        key                 返回当前数组内部指针指向数组元素的键名
        current/pos         返回当前数组内部指针指向数组元素
        end                 返回数组最后一个元素的值并且改变内部指针指向最后元素
        next                将当前指针向后移动一位并且返回值
        prev                将当前指针向前移动一位并且返回
        reset               将当前指针指向开头
        each                返回当前指针指向数组元素的值与键并且向后移动指针

    数组与变量的操作
        list                将数组每个元素赋值给指定变量
        compact             将多个普通变量组合成一个数组，变量为键名，变量值为键值
        extract             将数组元素转化成变量

    数组排序    *
        sort
            r       逆向排序
            a       保持索引关系
            k       按键名排序
            u       自定义函数排序
            nat     按自然排序算法排序
        usort

        ksort uksort
        rsort


数组作为函数参数尽量使用引用传递，节省内存使用量
封装函数尽量做到后期扩展不影响函数调用者


==============================================================================
作业
    1. 写函数实现对int型数组操作:
        对数组随机初始化
        对数组由用户输入来初始化
        求数组的最大值/最小值
        对数组进行反转
        对数组进行循环左移/右移
            1 2 3 4 5
            左移：2 3 4 5 1
            右移: 5 1 2 3 4
        对数组进行排序

    2. M个人围成一圈循环报数，报到N退出，输出退出顺序
        m / n 由用户指定

    3. 从一个正整数数组中找出第二大数(重复的不比较)
        3 9 7 4 10 8 10 9 7  结果为4
    --------------------------------------------------------

    4. 将弹球程序完善，碰到边界反弹随机变颜色

    5. 输入一行字符串，判断此字符串中括号是否匹配
        hello{world}kyo
        hello{wo(rld}kyo
        hello{wo}rld}kyo
        h(ello{wo)rld}kyo

    6. 迷宫求解

    7. 舞会配对程序，循环配对，输出前三轮配对情况

vim:ft=php:
